﻿using System;
using System.Text;
using System.Windows.Forms;

namespace MyFastDataSourceBind
{
    /// <summary>
    /// 可绑定到数据源的按钮控件
    /// </summary>
    /// <remarks>
    /// 开发人员可设置该控件的XDataSourceName属性来绑定按钮到一个数据源上，
    /// 可以设置XAction属性来设置该按钮操作数据源的功能。
    /// 编制 袁永福
    /// </remarks>
    public class XDBButton : System.Windows.Forms.Button, IXDataSourceable
    {
        /// <summary>
        /// 初始化对象
        /// </summary>
        public XDBButton()
        {
        }

        private string strPromptText = null;
        /// <summary>
        /// 执行动作前的提示文本
        /// </summary>
        [System.ComponentModel.Category("Action")]
        [System.ComponentModel.DefaultValue(null)]
        public string PromptText
        {
            get
            {
                return strPromptText;
            }
            set
            {
                strPromptText = value;
            }
        }

        private XDataSourceActionStyle intXAction = XDataSourceActionStyle.None;
        /// <summary>
        /// 动作类型
        /// </summary>
        [System.ComponentModel.Category("Data")]
        [System.ComponentModel.DefaultValue(XDataSourceActionStyle.None)]
        public XDataSourceActionStyle XAction
        {
            get
            {
                return intXAction;
            }
            set
            {
                intXAction = value;
            }
        }

        private string strXDataSourceName = null;
        /// <summary>
        /// 按钮操作的数据源名称
        /// </summary>
        [System.ComponentModel.Editor(
            typeof(XDataSourceNameEditor),
            typeof(System.Drawing.Design.UITypeEditor))]
        public string XDataSourceName
        {
            get
            {
                return strXDataSourceName;
            }
            set
            {
                strXDataSourceName = value;
                XDataSourceEventSender.Register(this, strXDataSourceName);
            }
        }

        /// <summary>
        /// 销毁对象,取消数据源绑定
        /// </summary>
        /// <param name="disposing"></param>
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
            XDataSourceEventSender.UnRegister(this);
        }

        /// <summary>
        /// 处理数据源事件
        /// </summary>
        /// <param name="Sender">事件发起者</param>
        /// <param name="Args">事件参数</param>
        public void HandleDataSourceEvent(object Sender, XDataSourceEventArgs Args)
        {
            // 根据按钮的不同的动作类型来设置按钮的可用状态
            switch (intXAction)
            {
                case XDataSourceActionStyle.None:
                    break;
                case XDataSourceActionStyle.Refresh:
                    // 本按钮功能是刷新数据，则只有数据源不处于编辑状态该按钮可用。
                    this.Enabled = !Args.DataSource.Editing;
                    break;
                case XDataSourceActionStyle.CancelEdit:
                    // 本按钮功能是取消编辑，则只有数据源处于编辑状态该按钮可用。
                    this.Enabled = Args.DataSource.Editing;
                    break;
                case XDataSourceActionStyle.Insert:
                    // 本按钮功能是新增数据，则只有数据源不处于编辑状态该按钮可用。
                    this.Enabled = !Args.DataSource.Editing;
                    break;
                case XDataSourceActionStyle.Delete:
                    // 本按钮功能是删除数据，则只有数据源具有数据而且不处于编辑状态则该按钮可用。
                    this.Enabled = Args.DataSource.HasRecord && !Args.DataSource.Editing;
                    break;
                case XDataSourceActionStyle.Edit:
                    // 本按钮功能是编辑数据，则只有数据源具有数据且不处于编辑状态则该按钮可用。
                    this.Enabled = Args.DataSource.HasRecord && !Args.DataSource.Editing;
                    break;
                case XDataSourceActionStyle.MoveFirst:
                    // 本按钮功能是移动到第一条记录，则调用数据源的CanMoveFirst属性。
                    this.Enabled = Args.DataSource.CanMoveFirst;
                    break;
                case XDataSourceActionStyle.MoveLast:
                    // 本按钮功能是移动到最后一条记录，则调用数据源的CanMoverLast属性。
                    this.Enabled = Args.DataSource.CanMoveLast;
                    break;
                case XDataSourceActionStyle.MoveNext:
                    // 本按钮功能是移动到下一条记录，则调用数据源的CanMoveNext属性。
                    this.Enabled = Args.DataSource.CanMoveNext;
                    break;
                case XDataSourceActionStyle.MovePrevious:
                    // 本按钮功能是移动到前一条记录，则调用数据源的CanMovePrevious属性。
                    this.Enabled = Args.DataSource.CanMovePrevious;
                    break;
                case XDataSourceActionStyle.Save:
                    // 本按钮功能是保存数据，则只有数据源处于编辑状态该按钮可用。
                    this.Enabled = Args.DataSource.Editing;
                    break;
            }
        }

        /// <summary>
        /// 重载按钮点击事件，编辑数据源
        /// </summary>
        /// <param name="e">事件参数</param>
        protected override void OnClick(EventArgs e)
        {
            base.OnClick(e);
            // 根据绑定的数据源名称获得数据源对象
            XDataSource ds = XDataSource.GetInstance(this.XDataSourceName);
            if (ds != null)
            {
                if (strPromptText != null && strPromptText.Trim().Length > 0)
                {
                    // 进行用户提示
                    if (MessageBox.Show(
                        this,
                        strPromptText,
                        "系统提示",
                        MessageBoxButtons.YesNo,
                        MessageBoxIcon.Question) == DialogResult.No)
                    {
                        return;
                    }
                }
                switch (intXAction)
                {
                    case XDataSourceActionStyle.Refresh:
                        // 刷新数据源，数据源对象内部会广播FillUI事件。
                        ds.Refresh();
                        break;
                    case XDataSourceActionStyle.CancelEdit:
                        // 取消编辑，数据源对象内部会广播FillUI事件。
                        ds.CancelEdit();
                        break;
                    case XDataSourceActionStyle.Delete:
                        // 删除当前记录，数据源对象内部会广播FillUI事件。
                        ds.DeleteRecord();
                        break;
                    case XDataSourceActionStyle.Edit:
                        // 开始编辑，数据源对象内部会广播FillUI事件。
                        ds.BeginEdit();
                        break;
                    case XDataSourceActionStyle.MoveFirst:
                        // 移动到第一条记录，数据源对象内部会广播FillUI事件。
                        ds.MoveFirst();
                        break;
                    case XDataSourceActionStyle.MoveLast:
                        // 移动到最后一条记录，数据源对象内部会广播FillUI事件。
                        ds.MoveLast();
                        break;
                    case XDataSourceActionStyle.MoveNext:
                        // 移动到下一条记录，数据源对象内部会广播FillUI事件。
                        ds.MoveNext();
                        break;
                    case XDataSourceActionStyle.MovePrevious:
                        // 移动到上一条记录，数据源对象内部会广播FillUI事件。
                        ds.MovePrevious();
                        break;
                    case XDataSourceActionStyle.Insert:
                        // 插入新的记录，数据源对象内部会广播FillUI事件。
                        ds.NewRecord();
                        break;
                    case XDataSourceActionStyle.Save:
                        // 保存修改，数据源对象内部会广播ReadUI事件。
                        ds.SaveRecord();
                        break;
                }
            }
        }//protected override void OnClick(EventArgs e)

    }//public class XDBButton
}